package org.dylan.common.paging;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author Dylan
 * @date 2011-6-26 下午04:03:30
 * @param <T>
 *            data type
 */
public class PageData<T> implements Serializable {
	private static final long serialVersionUID = -1197738994674801089L;
	protected int pageNo = 1;
	protected int pageSize = -1;

	// -- 当前页数据--//
	protected List<T> result = new ArrayList<T>();
	protected int totalCount = 0;

	public PageData(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 获得当前页的页号,序号从1开始,默认为1.
	 */
	public int getPageNo() {
		return pageNo;
	}

	/**
	 * 设置当前页的页号,序号从1开始,低于1时自动调整为1.
	 */
	public PageData<T> pageNo(int pageNo) {
		this.pageNo = pageNo < 1 ? 1 : pageNo;
		return this;
	}

	/**
	 * 获得每页的记录数量, 默认为-1.
	 */
	public int pageSize() {
		return pageSize;
	}

	/**
	 * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始.
	 */
	public int start() {
		return pageSize <= 0 ? 1 : ((pageNo - 1) * pageSize) + 1;
	}

	/**
	 * @return the result
	 */
	public List<T> getResult() {
		return result;
	}

	/**
	 * @param result
	 *            the result to set
	 */
	public void setResult(List<T> result) {
		this.result = result;
	}

	/**
	 * 获得总记录数, 默认值为0.
	 */
	public int getTotalCount() {
		return totalCount;
	}

	/**
	 * 设置总记录数.
	 */
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}

	/**
	 * 根据pageSize与totalCount计算总页数, 默认值为-1.
	 */
	public int getTotalPage() {
		if (totalCount <= 0) {
			return 1;
		}

		int count = totalCount / pageSize;
		if (totalCount % pageSize > 0) {
			count++;
		}
		return count;
	}

	/**
	 * 是否还有下一页.
	 */
	public boolean hasNextPage() {
		return (pageNo + 1 <= getTotalPage());
	}

	/**
	 * 取得下页的页号, 序号从1开始. 当前页为尾页时仍返回尾页序号.
	 */
	public int getNextPageNo() {
		if (hasNextPage()) {
			return pageNo + 1;
		} else {
			return pageNo;
		}
	}

	/**
	 * 是否还有上一页.
	 */
	public boolean hasPrePage() {
		return (pageNo - 1 >= 1);
	}

	/**
	 * 取得上页的页号, 序号从1开始. 当前页为首页时返回首页序号.
	 */
	public int getPrePageNo() {
		if (hasPrePage()) {
			return pageNo - 1;
		} else {
			return pageNo;
		}
	}

}
